/*

 */

package br.uniceub.fsw.util;

import java.util.StringTokenizer;

/**
 *
 * Classe responsa'vel pela validacao de cada campo
 * de um dado formulario.<br/>
 * Exemplos:    <br/>
 * 
 * <p>NO_Aluno -> permite, no ma'ximo, 50 caracteres</p><br/>
 * <p>DT_Transacao -> permite, no ma'ximo, 10 caracteres</p><br/>
 * 
 * <b>Obs.: Ver a classe 'InputHtml' para maiores informacoes.</b>
 * 
 * @author sergiofernandomuniz
 * @version 1.0
 * @see InputHtml, Conversor, BaseFacade.
 * 
 */
public class Validacao {
   

     /**
     * @param String valorCampo, Integer tamahoMaximoPermitido, String mensagemErro.
     * 
     * <br/>Exemplo:<br/> <i>Validacao.validaTamanhoCampoGenerico("asdfg", 5,
            "O campo tal ultrapassou o valor limite para preenchimento");</i>
     * 
     *<br/> 
     * @return um objeto ErroVO
     * com o atributo <i>dsErro</i>  setado com o valor da varia'vel <i>mensagemErro</i>.
     *<br />
     *<b>ATENCAO:</b>
     *<br /> 
     *Esse m'etodo valida <b>SOMENTE</b> o tamanho do campo. Portanto se houver necessidade
     * de uma validacao mais segura (CPF e e-mail, por exemplo), observe os demais me'todos
     * dessa classe.
     *  
     */
    public static ErroVO validaTamanhoCampoGenerico(String valorCampo, Integer tamanhoMaximoPermitido,
            String mensagemErro){

        if(!Validacao.validaSeValorCampoEstaNuloOuVazio(valorCampo)){

            if(valorCampo.length() > tamanhoMaximoPermitido){
                
                System.out.println(mensagemErro);
                return new ErroVO(mensagemErro);

            }

        }

        return null;

    }

    public static Boolean validaSeValorCampoEstaNuloOuVazio(String valor){
        
        if((valor == null)||(valor.trim().length() == 0)){
            
            return true;
            
        }
        
        return false;
        
    }
    
     /**
     * @param CEP.
     * Exemplo:<br/>
     * Campo CEP -> Valor: 71727-122.
     * @return um objeto boolean:<br/>
     * <i>false</i> se o campo-parametro tiver valor e <i>true</i> se estiver ou nulo
     * ou vazio
     */
    public static ErroVO validaCep(String cep){
        
        ErroVO erro = new ErroVO("O campo CEP ultrapassou o valor limite.");
        
        if(!validaSeValorCampoEstaNuloOuVazio(cep)){
            
            if((cep != null) || (cep.length() > 8)){

                return erro;
                
            }
            
        }
        
        if(cep.length() < 8){
            
            return new ErroVO("O cep digitado é invalido");
            
        }
        
        return null;
        
    }
    
    /**
     * @param CPF.
     * Exemplo: 025.257.353-66 -> O tratamento será dado pela classe "Conversor"
     */
    public static ErroVO validaCPF(String cpf){
        
        ErroVO erro = new ErroVO("O CPF preenchido nao é valido.");
        
        if((validaSeValorCampoEstaNuloOuVazio(cpf) || (cpf.length() != 11))){
            
            if(!CPF.validaCPF(cpf)){
                
                return erro;   

            }
            
        }
        
        if(cpf.length() < 11){
            
            return new ErroVO("O campo CPF foi preenchido incorretamente");
            
        }
        
        return null;
    }
    
    /**
     * @param Data.
     * Exemplo: 11/09/1987 -> O tratamento será dado pela classe "Conversor"
     */
    public static ErroVO validaData(String data){
        
        ErroVO erro = new ErroVO("A data informada é inválida.");
        
        if(!validaSeValorCampoEstaNuloOuVazio(data)){
            
            if(!Conversor.validaData(data)){
                
                return erro;
                
            }
            
            else if(data.length() > 10){
                
                return new ErroVO("O campo data ultrapassou o valor limite.");
            
            }
            
        }
        
        return null;
        
    }
    
    /**
     * @param DH.
     * Exemplo: 
     */
    public static ErroVO validaDH(String dh){

     
        return null;
        
    }
    
    /**
     * @param Descricao.
     * Exemplo: DS_Produto -> O produto apresenta 120 dias de garantia
     *                          pelo fabricante.
     */
    public static ErroVO validaDescricao(String descricao){
        
        ErroVO erro = new ErroVO("O campo descrição ultrapassou o valor limite.");
        
        if(!validaSeValorCampoEstaNuloOuVazio(descricao)){
            
            if(descricao.length() > 4096){
                
                return erro;
                
            }
            
        }
        
        if(descricao.length() < 5){
            
            return new ErroVO("O campo descricao exige pelo menos 5 caracteres.");
            
        }
     
        return null;
        
    }
    
    /**
     * @param ED.
     * Exemplo: ED
     */
    public static ErroVO validaED(String ED){//Endereco
        
        
     
        return null;
        
    }
    
    /**
     * @param Endereço eletrônico -> E-mail.
     * Exemplo: exemplo@provedor.com.br
     */
    public static ErroVO validaEnderecoEletronico(String enderecoEletronico){
        
        ErroVO erro = new ErroVO("O campo endereço eletrônico ultrapassou " +
                        "o valor limite.");
        
        if(!validaSeValorCampoEstaNuloOuVazio(enderecoEletronico)){
            
            if(enderecoEletronico.length() > 100){
                
                return erro;
            
            }
            
        }
        
        return null;
        
    }
    
    /**
     * 
     * @param enderecoEmail
     * Exemplo: usuario@provedor.com.br -> o método quebra em duas partes 
     * (<i>tokens</i>) o parametro da seguinte maneira:
     * 
     * <br/>TOken 1 = 'usuario'; <br/>
     * <br/>Delimitador = '@'; <br/> -> Nao e' <i>token</i>
     * <br/>TOken 2 = 'provedor.com.br'; <br/>
     * 
     * Apo's isso, o me'todo valida as partes de acordo com o tamanho.
     * 
     * @return Um objeto ErroVO.
     */
    static  ErroVO validaEmail (String enderecoEmail){
        
        StringTokenizer stk;
        ErroVO erro = new ErroVO("O e-mail informado é invalido.");
        
        if(!validaSeEmailEstaNuloOuVazio(enderecoEmail)){
            
            if((enderecoEmail.contains("@") && (enderecoEmail.length() > 0))){
                
                stk = new StringTokenizer(enderecoEmail, "@");
                String usuario = stk.nextToken();
                String provedorEmail = stk.nextToken();

                if((!validaSeUsuarioEmailEstaNuloOuVazio(usuario)) &&
                        (!validaSeProvedorEmailEstaNuloOuVazio(provedorEmail))){

                    return null; 

                }else{

                    return erro;


                }

            }
        
        }
        
        else{
            
            System.out.println("E-mail inválido");
            return erro;
            
        }    
            
        return null;
        
    }
    
    /**
     * 
     * @param enderecoEmail
     * @return Um objeto boolean <i>false</i> se o e-mail for <i>null</i> ou 
     * vazio, caso contra'rio retorna <i>true</i>.
     * 
     */
    
    private static boolean validaSeEmailEstaNuloOuVazio(String enderecoEmail){
        
        if((enderecoEmail == null) || (enderecoEmail.length() == 0)){
            
            return true;
            
        }else{
            
            return false;
            
        }
        
    }
    
    /**
     * 
     * @param usuarioEmail
     * @return Um objeto boolean <i>false</i> se o <i>token</i> referente ao usuario
     * do e-mail for <i>null</i> ou vazio, caso contra'rio retorna <i>true</i>.
     */
    
    protected static boolean validaSeUsuarioEmailEstaNuloOuVazio(String usuarioEmail){
        
        if((usuarioEmail == null) || (usuarioEmail.length() == 0)){
            
            return true;
            
        }else{
            
            return false;
            
        }
        
    }
    
    private static boolean validaSeProvedorEmailEstaNuloOuVazio(String provedorEmail){
        
        if((provedorEmail == null) || (provedorEmail.length() == 0)){
            
            return true;
            
        }else{
            
            return false;
            
        }
        
    }
    
    /**
     * @param LK.
     * Exemplo: Lk.
     * @return Um objeto ErroVO.
     */
    public static ErroVO validaLK(String lk){
     
        return null;
        
    }
    
    /**
     * @param Nome.
     * @return Um objeto ErroVO.
     */
    public static ErroVO validaNome(String nome){
        
        ErroVO erro = new ErroVO("O campo nome ultrapassou o valor limite.");
        
        if(!validaSeValorCampoEstaNuloOuVazio(nome)){
            
            if(nome.length() > 50){
                
                System.out.println("\nErro: Campo nome ultrapassou valor limite.");
                return erro;
            
            }
            
        }
        
        if(nome.length() < 5){
            
            System.out.println("\nErro: O campo nome exige pelo menos 5 caracteres.");
            return new ErroVO("O campo nome exige pelo menos 5 caracteres.");
            
        }
     
        return null;
        
    }
    
    /**
     * @param Observacao.
     * @return Um objeto ErroVO.
     */
    public static ErroVO validaObservacao(String observacao){
        
        ErroVO erro = new ErroVO("O campo observação ultrapassou o valor limite");
        
        if(!validaSeValorCampoEstaNuloOuVazio(observacao)){
            
            if(observacao.length() > 4096){
                
                return erro;
                
            }
            
        }
        
        if(observacao.length() < 5){
            
            return new ErroVO("O campo observacao exige pelo menos 5 caracteres.");
            
        }
     
        return null;
        
    }
    
    /**
     * @param Sexo.
     * Exemplo: M ou F
     * @return Um objeto ErroVO.
     */
    public static ErroVO validaSexo(String sexo){
     
        return null;
        
    }
    
    /**
     * @param Status.
     * Exemplo: 1, 2, 3...N.
     * @return Um objeto ErroVO.
     */
    public static ErroVO validaStatus(String status){
     
        return null;
        
    }
    
    /**
     * @param Telefone.
     * Exemplo: 99(99)9999-9999 ou maior
     * @return Um objeto ErroVO.
     */
    public static ErroVO validaTelefone(String telefone){
        
        ErroVO erro = new ErroVO();
        
        if(!validaSeValorCampoEstaNuloOuVazio(telefone)){
            
            if(telefone.length() > 15){
                
                erro.setDsErro("O campo telefone ultrapassou o valor limite.");
                
            }
            
        }
        
        if(telefone.length() < 3){
            
            return new ErroVO("O campo telefone exige pelo menos 3 caracteres.");
            
        }
     
        return null;
        
    }
    
    /**
     * @param TE.
     * Exemplo: te
     * @return Um objeto ErroVO.
     */
    public static ErroVO validaTE(String te){
     
        return null;
        
    }
    
    /**
     * @param Valor.
     * <br/>
     * Exemplo: R$ 1234,90 ou 43908 ou superior
     * <br/>
     * <p>Obs.: Validacao geral de valores, seja monetario ou quantitativo.</p>
     * <br/>
     * @return Um objeto ErroVO.
     * 
     */
    public static ErroVO validaValor(String valor){
        
        ErroVO erro = new ErroVO("O campo valor ultrapassou o limite de " +
                        "preenchimento.");
        
        if(!validaSeValorCampoEstaNuloOuVazio(valor)){
            
            if(valor.length() > 8){
                
                return erro;
            
            }
            
        }
     
        return null;
        
    }
    
    /**
     * @param PS.
     * Exemplo: ps
     * @return Um objeto ErroVO.
     */
    public static ErroVO validaPS(String ps){
     
        return null;
        
    }
    
    /*public static void main(String args[]){
        
        Validacao.validaTamanhoCampoGenerico("sadfg", 2, "O campo tal ultrapassou o valor limite.");
        
    }*/
   
}
